package com.seeyon.apps.nygj.util;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.cap4.form.bean.FormBean;
import com.seeyon.cap4.form.bean.FormDataMasterBean;
import com.seeyon.cap4.form.bean.FormDataSubBean;
import com.seeyon.cap4.form.service.CAP4FormManager;
import com.seeyon.cap4.template.manager.CAPDataListSqlHelpManager;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager;
import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SyncFiledKit {

    private static EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew");
    private static CAP4FormManager cap4FormManager = (CAP4FormManager) AppContext.getBean("cap4FormManager");
    private static CAPDataListSqlHelpManager capDataListSqlHelpManager = (CAPDataListSqlHelpManager) AppContext.getBean("capDataListSqlHelpManager");


    /**
     * 获取同步字段信息
     *
     * @param dataId 数据ID，用于查询数据主表信息
     * @param dataObj 数据对象，包含待同步的数据
     * @param formBean 表单豆对象，用于查询表单信息
     * @param dataFormBean 数据表单豆对象，用于对比判断数据是否为新数据
     * @return 返回一个Map，其中包含同步字段的信息，字段列表按照是否为新数据分类
     * @throws Exception 如果查询或处理过程中出现错误，则抛出异常
     */
    public static Map<String, List<Map<String, Object>>> getSyncFields(String dataId, JSONObject dataObj, FormBean formBean, FormBean dataFormBean) throws Exception {
        // 初始化存储同步字段信息的Map
        Map<String, List<Map<String, Object>>> syncFieldMap = new HashMap<String, List<Map<String, Object>>>();
        // 初始化字段列表
        List<Map<String, Object>> fieldList = new ArrayList<Map<String, Object>>();

        // 根据dataId查询数据主表信息
        FormDataMasterBean formDataMasterBean = cap4FormManager.getDataMasterBeanById(Long.parseLong(dataId), formBean, null);
        // 获取数据主表的第一个子表信息
        Map<String, List<FormDataSubBean>> subsMap = formDataMasterBean.getSubTables();
        List<FormDataSubBean> formDataSubBeans = null;
        for (String key : subsMap.keySet()) {
            if (subsMap.get(key).size() > 0) {
                formDataSubBeans = subsMap.get(key);
                break;
            }
        }
        // 标记是否为新数据
        String isNewData = "";

        // 遍历子表字段，填充字段信息到fieldList中
        for (int i = 0; i < formDataSubBeans.size(); i++) {
            Map<String, Object> fieldMap = new HashMap<String, Object>();
            FormDataSubBean formDataSubBean = formDataSubBeans.get(i);

            // 获取字段对应的OA控件名称、接口字段名称、是否唯一标识字段的值
            String oaFieldName = StrKit.str(formDataSubBean.getFieldValue(formDataSubBean.getFormTable().getFieldBeanByDisplay("OA控件名称").getName()));
            String dbFieldName = StrKit.str(formDataSubBean.getFieldValue(formDataSubBean.getFormTable().getFieldBeanByDisplay("接口字段名称").getName()));
            String wybsId = StrKit.str(formDataSubBean.getFieldValue(formDataSubBean.getFormTable().getFieldBeanByDisplay("是否唯一标识").getName()));

            // 判断是否为唯一标识，并根据结果更新isNewData标记
            if (!"".equals(wybsId)) {
                CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(Long.parseLong(wybsId));
                if ("是".equals(ctpEnumItem.getShowvalue())) {
                    isNewData = isNewData(oaFieldName, dataFormBean, dataFormBean.getMasterTableBean().getTableName(), StrKit.str(dataObj.get(dbFieldName)));
                }
            }

            // 将字段名添加到字段映射表中
            fieldMap.put(oaFieldName.trim(), dbFieldName.trim());
            fieldList.add(fieldMap);
        }
        // 将字段列表按照是否为新数据分类，并添加到syncFieldMap中
        syncFieldMap.put(StrKit.str(isNewData), fieldList);
        return syncFieldMap;
    }

    /**
     * 判断给定的数据是否为新数据。
     *
     * @param fieldName 表单字段的显示名称，用于查找对应的实际字段名。
     * @param formBean 表单对象，用于通过显示名称获取字段实际名称。
     * @param tableName 数据库表名。
     * @param data 要判断是否为新数据的数据值。
     * @return 如果数据库中不存在该数据，则返回true，表示是新数据；如果已存在，则返回false。
     * @throws Exception 如果过程中出现异常，则抛出。
     */
    private static String isNewData(String fieldName, FormBean formBean, String tableName, String data) throws Exception {
        StringBuilder stb = new StringBuilder();
        // 根据表单字段的显示名称获取实际字段名
        String zjFieldName = formBean.getFieldBeanByDisplay(fieldName).getName();
        // 构造查询SQL，检查给定数据是否已存在于指定表中
        stb.append("select id from ").append(tableName).append(" where ");
        stb.append(zjFieldName).append(" = '").append(data).append("'");
        // 执行查询
        List<Object> dataList = capDataListSqlHelpManager.selectDataList(stb.toString(), null);
        // 判断查询结果，如果列表为空，则表示数据是新的；如果不为空，则表示数据已存在
        if (dataList.isEmpty()) {
            return "new";
        } else {
            String dataId = "";
            for (int k = 0; k < dataList.size(); k++) {
                Map<String, Object> dataMap = (Map<String, Object>) dataList.get(k);
                dataId = StrKit.str(dataMap.get("id"));
            }
            return dataId;
        }
    }
}